package com.zzyl.nursing.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzyl.nursing.domain.Contract;
import com.zzyl.nursing.mapper.ContractMapper;
import com.zzyl.nursing.service.IContractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/**
 * 合同Service业务层处理
 *
 * @author zhx
 * @date 2025-05-17
 */
@Service
public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> implements IContractService {
	@Autowired
	private ContractMapper contractMapper;

	/**
	 * 查询合同
	 *
	 * @param id 合同主键
	 * @return 合同
	 */
	@Override
	public Contract selectContractById(Long id) {
		return getById(id);
	}

	/**
	 * 查询合同列表
	 *
	 * @param contract 合同
	 * @return 合同
	 */
	@Override
	public List<Contract> selectContractList(Contract contract) {
		return contractMapper.selectContractList(contract);
	}

	/**
	 * 新增合同
	 *
	 * @param contract 合同
	 * @return 结果
	 */
	@Override
	public int insertContract(Contract contract) {
		return save(contract) ? 1 : 0;
	}

	/**
	 * 修改合同
	 *
	 * @param contract 合同
	 * @return 结果
	 */
	@Override
	public int updateContract(Contract contract) {
		return updateById(contract) ? 1 : 0;
	}

	/**
	 * 批量删除合同
	 *
	 * @param ids 需要删除的合同主键
	 * @return 结果
	 */
	@Override
	public int deleteContractByIds(Long[] ids) {
		return removeByIds(Arrays.asList(ids)) ? 1 : 0;
	}

	/**
	 * 删除合同信息
	 *
	 * @param id 合同主键
	 * @return 结果
	 */
	@Override
	public int deleteContractById(Long id) {
		return removeById(id) ? 1 : 0;
	}

	/**
	 * 更新合同状态
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void updateContractStatus() {
		//处理已生效的
		//查询状态为未生效的,以及系统时间在开始和结束时间中间的
		List<Contract> contractList = this.lambdaQuery()
				.eq(Contract::getStatus, 0)
				.le(Contract::getStartDate, LocalDateTime.now())
				.ge(Contract::getEndDate, LocalDateTime.now())
				.list();
		if (CollUtil.isNotEmpty(contractList)){
			//更新状态值为1(已生效)
			contractList.forEach(x->{
				//逐条更新
				this.lambdaUpdate().eq(Contract::getId,x.getId()).set(Contract::getStatus,1).update();
			});
		}

		//处理已过期的
		//查询状态为未生效或已生效的,以及系统时间大于结束时间的
		List<Contract> contractList1 = this.lambdaQuery()
				.in(Contract::getStatus, 0, 1)
				.lt(Contract::getEndDate, LocalDateTime.now())
				.list();
		if (CollUtil.isNotEmpty(contractList1)){
			//更新状态值为2(已过期)
			contractList1.forEach(x->{
				//逐条更新
				this.lambdaUpdate().eq(Contract::getId, x.getId()).set(Contract::getStatus, 2).update();
			});
		}
	}
}
